#include "Pouvoir.h"
#include "Pouvoir_private.h"
#include "Erreur.h"

#include <string.h>

/* Constructeur (protected)  */
Pouvoir* newPouvoir(char* nom,int quantite,Personnage* perso){
	Pouvoir* p;
	
	p = emalloc(sizeof(Pouvoir));
	if(p == NULL) return NULL;
	
	pouvoirSetNom(p,nom);
	pouvoirSetQuantite(p,quantite);
	pouvoirSetPersonnage(p,perso);
	pouvoirSetType(p,tpUndefined);

	return p;
}

/* Destructeur */
void deletePouvoir(Pouvoir* p){
	if(p == NULL) return;
	
	if(p->free)
		p->free(p);
	
	if(p->perso)
		persoSetPouvoir(p->perso,NULL);
	
	free(p->nom);
	free(p);
}

/* Getters */
char* pouvoirGetNom(Pouvoir* pouvoir){
	if(pouvoir == NULL) return NULL;
	
	return pouvoir->nom;
}

int pouvoirGetQuantite(Pouvoir* pouvoir){
	if(pouvoir == NULL) return -1;
	
	return pouvoir->quantite;
}

Personnage* pouvoirGetPersonnage(Pouvoir* pouvoir){
	if(pouvoir == NULL) return NULL;
	
	return pouvoir->perso;
}

TypePouvoir pouvoirGetType(Pouvoir* pouvoir){
	if(pouvoir == NULL) return tpUndefined;
	
	return pouvoir->type;
}

/* Settlers */
void pouvoirSetNom(Pouvoir* pouvoir,char* nom){
	char* pNom;
	
	if(pouvoir == NULL) return;
	
	pNom = emalloc(strlen(nom) + 1);
	if(pNom == NULL) return;
	
	strcpy(pNom,nom);
	pouvoir->nom = pNom;
}

void pouvoirSetQuantite(Pouvoir* pouvoir,int quantite){
	if(pouvoir == NULL) return;
	
	pouvoir->quantite = quantite;
}

void pouvoirSetPersonnage(Pouvoir* pouvoir,Personnage* perso){
	if(pouvoir == NULL) return;
	
	pouvoir->perso = perso;
	
	if(perso != NULL && persoGetPouvoir(perso) != pouvoir)
		persoSetPouvoir(perso,pouvoir);
	
}

void pouvoirSetType(Pouvoir* pouvoir,TypePouvoir type){
	if(pouvoir == NULL) return;
	
	pouvoir->type = type;
}

/* fonctions virtuelles */
int pouvoirAppliquer(Pouvoir* pouvoir, Jeu* jeu){
	if(pouvoir == NULL) return 0;
	
	if(pouvoir->appliquer != NULL)
		return pouvoir->appliquer(pouvoir,jeu);
	return 0;
}

int pouvoirCanUseItNow(Pouvoir* pouvoir, Jeu* jeu){
	if(pouvoir == NULL) return 0;
	
	if(pouvoir->canUseItNow != NULL)
		return pouvoir->canUseItNow(pouvoir,jeu);
	return 0;
}
